home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Files / Utils / SWFixed.c < prev    next >
Encoding:
Text File  |  2000-10-06  |  2.5 KB  |  117 lines  |  [TEXT/CWIE]

  1.  
  2. //-----------------------------------------------------------------
  3. //    SWFixed - fixed point routines for SpriteWorld
  4. //
  5. //    Written by Anders F Björklund <afb@algonet.se>
  6. //    © 1995-2000 afb
  7. //
  8. //    Thanks to Anton Kirzenow for inspiration. 
  9. //-----------------------------------------------------------------
  10.  
  11. #include <SWFixed.h>
  12.  
  13. long                    gSWNumAngles = 0;
  14. SWFixed                    *gSWSinTable = NULL;
  15. SWFixed                    *gSWCosTable = NULL;
  16.  
  17. static SWFixed            *gSWTrigTable = NULL;
  18.  
  19. #define PI                3.1415926535898
  20. #define ACCURACY        10
  21.  
  22. OSErr SWInitTrigTables(short numAngles)
  23. {
  24.     SWFixed        *table;
  25.     double        ang,delta;
  26.     double        sum,sign,sqr,power,fact,one = 1.0;
  27.     double        inv_factorials[ ACCURACY ];
  28.     short         numAngles2 = numAngles >> 1,
  29.                 numAngles4 = numAngles >> 2,
  30.                 numAngles8 = numAngles >> 3;
  31.     SWFixed        trig;
  32.     long        a,i;
  33.  
  34.     table = (SWFixed *) NewPtr( sizeof(SWFixed) * (numAngles+numAngles4+1) );
  35.     if ( table == NULL )
  36.         return memFullErr;
  37.  
  38.     delta = one;
  39.     ang = one;
  40.     
  41.         // precompute inverse factorials for speed
  42.     fact = one;    
  43.     for (i=0; i < ACCURACY; i++)
  44.     {
  45.         fact *= ang;        
  46.         inv_factorials[i] = one / fact;
  47.         ang += delta;
  48.     }
  49.     
  50.     delta = (2.0 * PI) / (double) numAngles;
  51.     ang = 0.0;
  52.     
  53.     for (a = 0; a < numAngles8; a++)
  54.     {
  55.             // calculate sin by sums
  56.         sqr = ang * ang;
  57.         sum = ang;
  58.         sign = -one; 
  59.         power = ang * sqr;
  60.         for (i=3; i < ACCURACY; i+=2)
  61.         {
  62.             sum += sign * power * inv_factorials[i-1];
  63.             sign = -sign;
  64.             power *= sqr;
  65.         }
  66.         
  67.             // convert to fixpoint
  68.         trig = SW_FLOAT2FIX( sum );
  69.             
  70.             // store in table
  71.         table[a] =                 +trig;        // first quadrant
  72.         table[numAngles2 - a] =    +trig;        // second quadrant
  73.         table[a + numAngles2] =    -trig;        // third quadrant
  74.         table[numAngles - a] =    -trig;        // fourth quadrant
  75.  
  76.         table[a + numAngles] =  trig;        // "fifth" quadrant (same as first - for cos)
  77.  
  78.         ang += delta;
  79.     }
  80.  
  81.     ang = (- PI / 4.0);
  82.     
  83.     for (a = numAngles8; a <= numAngles4; a++)
  84.     {
  85.             // calculate cos by sums
  86.         sqr = ang * ang;
  87.         sum = one;
  88.         sign = -one; 
  89.         power = sqr;
  90.         for (i=2; i < ACCURACY; i+=2)
  91.         {
  92.             sum += sign * power * inv_factorials[i-1];
  93.             sign = -sign;
  94.             power *= sqr;
  95.         }
  96.         
  97.             // convert to fixpoint
  98.         trig = SW_FLOAT2FIX( sum );
  99.             
  100.             // store in table
  101.         table[a] =                 +trig;        // first quadrant
  102.         table[numAngles2 - a] =    +trig;        // second quadrant
  103.         table[a + numAngles2] =    -trig;        // third quadrant
  104.         table[numAngles - a] =    -trig;        // fourth quadrant
  105.  
  106.         table[a + numAngles] =     trig;        // "fifth" quadrant (same as first - for cos)
  107.  
  108.         ang += delta;
  109.     }
  110.  
  111.     gSWTrigTable = table;
  112.     gSWNumAngles = numAngles;
  113.     gSWSinTable = table;
  114.     gSWCosTable = table + numAngles4;
  115.     return noErr;
  116. }
  117.